home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / shell / mscope / src / sub.c < prev   
Encoding:
C/C++ Source or Header  |  1995-04-30  |  4.3 KB  |  216 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <winb.h>
  5. #include <te.h>
  6. #include <fntb.h>
  7. #include <gui.h>
  8. #include <egb.h>
  9. #include <guidbg.h>
  10.  
  11. #include <block.h>
  12.  
  13. int    windowID = -1 ;
  14. int    quitIconID = -1 ;
  15. int    upIconID = -1 ;
  16. int    downIconID = -1 ;
  17.  
  18. extern void userIdleTask(void);
  19. extern EGB_BLOCK block ;
  20. extern EGB_BLOCK2 block2 ;
  21.  
  22. //#define DEBUG
  23.  
  24. #define MINZOOM (2)
  25. #define MAXZOOM (150)
  26.  
  27. int quitFuncRet = ILLEGAL_FUNCTION ;
  28.  
  29. unsigned int zoom ;    //倍率
  30. unsigned int xs,ys;    //読み込むサイズ-1(倍率変更・ウィンドウをリサイズしたとき、に変わる)
  31. unsigned int dx,dy;    // d* = x*>>1 ;
  32. unsigned int color_mode=999;
  33. unsigned int pixel[] = {4,8,16,24} ;
  34. HYPER whyp ;        //ウィンドゥのハイパー
  35. FRAME pf ;            //表示位置(ウィンドウを移動したりリサイズしたときに変わる)
  36. char *buffer=NULL ;    //バッファ
  37.  
  38. void setSize(void)
  39. {
  40.     xs = ((pf.rdwx-pf.lupx+1)/zoom)-1;
  41.     ys = ((pf.rdwy-pf.lupy+1)/zoom)-1;
  42.     #ifdef DEBUG
  43.     printf("size=(%d,%d)\n",xs,ys);
  44.     #endif
  45.     dx = (xs>>1);
  46.     dy = (ys>>1);
  47.     block2.dx = (xs+1) ;
  48.     block2.dy = (ys+1) ;
  49.     //画面モードをチェック
  50.     SCREEN scrn;
  51.     MMI_GetScreen( &scrn );
  52.     if(scrn.mode!=color_mode)
  53.     {    //色数が変更されている
  54.         color_mode = scrn.mode ;
  55.         if(buffer!=NULL) TL_free( buffer );
  56.         int length ;
  57.         if ( color_mode == 0 )
  58.             length = (xs+8)/8*4*(ys+1);        //16色モード専用処理
  59.         else
  60.             length = (xs+8)*pixel[color_mode]/8*(ys+1);
  61.         #ifdef DEBUG
  62.         printf("pixel= %d\n",pixel[color_mode]);
  63.         printf("buffer= %d bytes(%d,%d)\n",length,xs,ys);
  64.         #endif
  65.         buffer = TL_malloc( length );
  66.         if(buffer == NULL)
  67.         {    //メモリ確保失敗
  68.             #ifdef DEBUG
  69.             printf("TL_malloc failed\n");
  70.             #endif
  71.             MMI_SendMessage(quitIconID,MM_EXEC,2,0,0);
  72.         } else
  73.         {
  74.             block.pixel = (char *)buffer ;
  75.             block2.pixel = (char *)buffer ;
  76.         }
  77.     }
  78.  
  79.     return ;
  80. }
  81.  
  82. void setIcon(void)
  83. {
  84.     FRAME fr;
  85.  
  86.     //quitIconの設定
  87.     fr.lupx = whyp.fr.lupx+3;
  88.     fr.lupy = whyp.fr.rdwy-17;
  89.     fr.rdwx = fr.lupx+14;
  90.     fr.rdwy = fr.lupy+14;
  91.     MMI_SendMessage(quitIconID,MM_MOVE,1,&fr);
  92.     //upIconの設定
  93.     fr.lupx = whyp.fr.rdwx-47;
  94.     fr.rdwx = fr.lupx+14;
  95.     MMI_SendMessage(upIconID,MM_MOVE,1,&fr);
  96.     //downIconの設定
  97.     fr.lupx = whyp.fr.rdwx-32;
  98.     fr.rdwx = fr.lupx+14;
  99.     MMI_SendMessage(downIconID,MM_MOVE,1,&fr);
  100.  
  101.     return ;
  102. }
  103.  
  104. void setUser(void)
  105. {
  106.     FRAME size;
  107.     //ユーザー領域の設定
  108.     pf.lupx = 3;
  109.     pf.lupy = 3;
  110.     pf.rdwx = (whyp.fr.rdwx-whyp.fr.lupx-5)/zoom;
  111.     pf.rdwy = (whyp.fr.rdwy-whyp.fr.lupy-20)/zoom;
  112.     pf.rdwx = 2+pf.rdwx*zoom;
  113.     pf.rdwy = 2+pf.rdwy*zoom;
  114.     #ifdef DEBUG
  115.     printf("user=(%d,%d)-(%d,%d)\n",pf.lupx,pf.lupy,pf.rdwx,pf.rdwy);
  116.     #endif
  117.     size.lupx = 66;
  118.     size.lupy = 35;
  119.     size.rdwx = 1023;
  120.     size.rdwy = 511;
  121.     MMI_SendMessage(windowID,MM_SETUSER,2,&pf,&size);
  122.     //表示位置の設定
  123.     pf.lupx += whyp.fr.lupx;
  124.     pf.lupy += whyp.fr.lupy;
  125.     pf.rdwx += whyp.fr.lupx;
  126.     pf.rdwy += whyp.fr.lupy;
  127.     #ifdef DEBUG
  128.     printf("put=(%d,%d)-(%d,%d)\n",pf.lupx,pf.lupy,pf.rdwx,pf.rdwy);
  129.     #endif
  130.     block2.x1 = pf.lupx;
  131.     block2.y1 = pf.lupy;
  132.     block2.x2 = pf.rdwx;
  133.     block2.y2 = pf.rdwy;
  134.  
  135.     return ;
  136. }
  137.  
  138. /*    initDataGUI:windowID:MJ_WINDOWL40の呼び出し関数    */
  139. int    windowFunc(kobj, messId, argc, pev, trigger)
  140. int        kobj ;
  141. int        messId ;
  142. int        argc ;
  143. EVENT    *pev ;
  144. int        trigger ;
  145. {
  146.     if(messId==MM_SHOW)
  147.     {
  148.         #ifdef DEBUG
  149.         printf("window:MM_SHOW\n");
  150.         #endif
  151.         setSize();
  152.  
  153.     }
  154.     else
  155.     if(messId==MM_MOVE || messId==MM_UPDATE)
  156.     {
  157.         #ifdef DEBUG
  158.         printf("window:MM_MOVE||MM_UPDATE\n");
  159.         #endif
  160.         MMI_SendMessage(kobj,MM_GETHYPER,1,&whyp);
  161.         color_mode=999;
  162.         setUser();
  163.         setIcon();
  164.         setSize();
  165.     } else return (-1) ;
  166.  
  167.     return NOERR ;
  168. }
  169.  
  170. /*    initDataGUI:quitIconID:MJ_ICONL40の呼び出し関数    */
  171. int    quitFunc(kobj, messId, argc, pev, trigger)
  172. int        kobj ;
  173. int        messId ;
  174. int        argc ;
  175. EVENT    *pev ;
  176. int        trigger ;
  177. {
  178.     //メモリ開放
  179.     if(buffer!=NULL) TL_free( buffer );
  180.     //終了
  181.     MMI_SetHaltFlag( TRUE );
  182.     quitFuncRet = NOERR;
  183.     return NOERR ;
  184. }
  185.  
  186. /*    initDataGUI:upIconID:MJ_ICONL40の呼び出し関数    */
  187. /*    initDataGUI:downIconID:MJ_ICONL40の呼び出し関数    */
  188. int    upDownFunc(kobj, messId, argc, pev, trigger)
  189. int        kobj ;
  190. int        messId ;
  191. int        argc ;
  192. EVENT    *pev ;
  193. int        trigger ;
  194. {
  195.     int i;
  196.  
  197.     i=zoom;
  198.     if(kobj==upIconID)
  199.     {    if(zoom<MAXZOOM) zoom++; }
  200.     else
  201.         if(zoom>MINZOOM) zoom--;
  202.  
  203.     if(i==zoom) return NOERR ;
  204.  
  205.     color_mode = 999;
  206.     setUser();
  207.     setSize();
  208.     userIdleTask();
  209.  
  210.     #ifdef DEBUG
  211.     printf("zoom=%d\n",zoom);
  212.     #endif
  213.  
  214.     return NOERR ;
  215. }
  216.